import os import os.path import json ########### Fonctions données ########### def chargement_json(nom_fichier): """Charge le contenu d'un fichier JSON dans un dictionnaire Python renvoyé""" with open(nom_fichier, "r", encoding="utf8") as curseur: return json.load(curseur) def sauvegarde_json(dictionnaire, nom_fichier): """Sauvegarde le contenu d'un dictionnaire dans un fichier JSON""" with open(nom_fichier, "w", encoding="utf8") as curseur: json.dump(dictionnaire, curseur) def est_dictionnaire(objet): """Teste si un objet est de type dictionnaire""" return isinstance(objet, dict) ########################################## ### Première fonction à implémenter après avoir découvert le fichier JSON agrégé ### Cf fichier `empreinte_ada_agr.json` def total_simple(empreinte): """Fonction qui renvoie l'empreinte carbone totale d'un dictionnaire associant une empreinte carbone à des noms de catégories""" total = 0 for valeur in empreinte.values(): total = total + valeur return total empreinte = chargement_json("empreinte_ada_agr.json") print(total_simple(empreinte)) ### Deuxième fonction : il faut la récursivité pour le cas des sous-catégories ### Cf fichier `empreinte_ada.json` def total_rec(empreinte): """Fonction récursive qui renvoie l'empreinte carbone totale représentée par un dictionnaire dont les valeurs peuvent aussi être des dictionnaires""" total = 0 for valeur in empreinte.values(): if est_dictionnaire(valeur): total = total + total_rec(valeur) else: total = total + valeur return total def test_total_rec(): test_dico1 = {"a": 1, "d": 2} assert total_rec(test_dico1) == 3 test_dico2 = {"a": {"b": 1, "c": 2}, "d": {"e": 3}} assert total_rec(test_dico2) == 6 test_total_rec() # ========================================== # Fonction à analyser et corriger (Question 3) # ========================================== # Sur l'ancien fonction Dès qu’on trouve un dictionnaire, la fonction s’arrête immédiatement (return) def alerte_valeur_aberrante(empreinte, limite): """ Fonction censée déterminer si au moins une valeur du dictionnaire dépasse strictement la limite donnée. """ for categorie, valeur in empreinte.items(): if est_dictionnaire(valeur): return alerte_valeur_aberrante(valeur, limite) else: if valeur > limite: return True return False def test_alerte(): d1 = {"a": 10, "b": 20} assert alerte_valeur_aberrante(d1, 30) == False d2 = {"a": 10, "b": 40} assert alerte_valeur_aberrante(d2, 30) == True d3 = {"a": {"b": 10, "c": 20}, "d": 5} assert alerte_valeur_aberrante(d3, 30) == False d4 = {"a": {"b": 10, "c": 50}, "d": 5} assert alerte_valeur_aberrante(d4, 30) == True d5 = {"a": {"b": {"c": 1000}}} assert alerte_valeur_aberrante(d5, 500) == True test_alerte() empreinte = chargement_json("empreinte_ada.json") print(alerte_valeur_aberrante(empreinte, 1000))